package com.ken.apollo.commons.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 邮件内容处理工具类
 * 用于处理邮件发送前的内容格式化，特别是图片路径的绝对化处理
 *
 * @author Ken
 * @since 2025-08-25
 */
@Component
@Slf4j
public class MailContentUtils {

    @Value("${server.domain:localhost}")
    private String serverDomain;

    @Value("${server.port:80}")
    private String serverPort;

    @Value("${server.protocol:http}")
    private String serverProtocol;

    /**
     * 处理邮件内容，将相对路径的图片链接转换为绝对路径
     * 
     * @param htmlContent 原始HTML内容
     * @return 处理后的HTML内容
     */
    public String processMailContent(String htmlContent) {
        if (htmlContent == null || htmlContent.trim().isEmpty()) {
            return htmlContent;
        }

        try {
            // 构建基础URL
            String baseUrl = buildBaseUrl();
            
            // 处理img标签中的src属性
            String processedContent = processImageSrc(htmlContent, baseUrl);
            
            // 处理其他可能的相对路径链接
            processedContent = processOtherLinks(processedContent, baseUrl);
            
            log.info("【邮件内容处理完成】原始内容长度：{}, 处理后长度：{}, 基础URL：{}", 
                htmlContent.length(), processedContent.length(), baseUrl);
            
            return processedContent;
            
        } catch (Exception e) {
            log.error("【邮件内容处理失败】错误信息：{}", e.getMessage(), e);
            return htmlContent; // 处理失败时返回原始内容
        }
    }

    /**
     * 构建基础URL
     */
    private String buildBaseUrl() {
        StringBuilder baseUrl = new StringBuilder();
        baseUrl.append(serverProtocol).append("://").append(serverDomain);
        
        // 只有当端口不是默认端口时才添加端口号
        if (!"80".equals(serverPort) && !"443".equals(serverPort)) {
            baseUrl.append(":").append(serverPort);
        }
        
        return baseUrl.toString();
    }

    /**
     * 处理img标签中的src属性
     */
    private String processImageSrc(String htmlContent, String baseUrl) {
        // 匹配img标签中的相对路径src属性
        // 支持多种格式：src="/api/file/get?filename=xxx" 或 src='/api/file/get?filename=xxx'
        Pattern imgPattern = Pattern.compile(
            "<img[^>]*?src\\s*=\\s*[\"']\\s*(/api/file/get\\?filename=[^\"'\\s>]+)[\"'][^>]*?>",
            Pattern.CASE_INSENSITIVE | Pattern.DOTALL
        );
        
        Matcher matcher = imgPattern.matcher(htmlContent);
        StringBuffer result = new StringBuffer();
        
        while (matcher.find()) {
            String relativePath = matcher.group(1);
            String absolutePath = baseUrl + relativePath;
            
            // 替换整个匹配的img标签，将相对路径替换为绝对路径
            String replacement = matcher.group(0).replace(relativePath, absolutePath);
            matcher.appendReplacement(result, Matcher.quoteReplacement(replacement));
            
            log.debug("【图片路径转换】{} -> {}", relativePath, absolutePath);
        }
        
        matcher.appendTail(result);
        return result.toString();
    }

    /**
     * 处理其他可能的相对路径链接（如a标签的href等）
     */
    private String processOtherLinks(String htmlContent, String baseUrl) {
        // 处理a标签中的href属性
        Pattern linkPattern = Pattern.compile(
            "<a[^>]*?href\\s*=\\s*[\"']\\s*(/[^\"'\\s>]+)[\"'][^>]*?>",
            Pattern.CASE_INSENSITIVE | Pattern.DOTALL
        );
        
        Matcher matcher = linkPattern.matcher(htmlContent);
        StringBuffer result = new StringBuffer();
        
        while (matcher.find()) {
            String relativePath = matcher.group(1);
            
            // 只处理以/api/开头的相对路径链接
            if (relativePath.startsWith("/api/")) {
                String absolutePath = baseUrl + relativePath;
                String replacement = matcher.group(0).replace(relativePath, absolutePath);
                matcher.appendReplacement(result, Matcher.quoteReplacement(replacement));
                
                log.debug("【链接路径转换】{} -> {}", relativePath, absolutePath);
            } else {
                matcher.appendReplacement(result, Matcher.quoteReplacement(matcher.group(0)));
            }
        }
        
        matcher.appendTail(result);
        return result.toString();
    }

    /**
     * 验证URL是否为绝对路径
     */
    public boolean isAbsoluteUrl(String url) {
        if (url == null || url.trim().isEmpty()) {
            return false;
        }
        
        return url.matches("^https?://.*") || url.matches("^//.*");
    }

    /**
     * 获取当前配置的基础URL（用于测试和调试）
     */
    public String getBaseUrl() {
        return buildBaseUrl();
    }
}